package gt

import (
	"gitee.com/dark.H/gs"
	"github.com/nsf/termbox-go"
)

type PanelInput struct {
	*PanelHandler
	typedStr  gs.Str
	offset    int
	cursorPos Point
}

func NewPanelInput(xy_if_one_is_set_y ...int) *PanelInput {
	p := &PanelInput{
		PanelHandler: NewPanelHandler(),
	}
	p.SetSizeHeight(1)
	p.SetBorder(false).SetBar(false).SetIfShowCursor(true)
	if xy_if_one_is_set_y != nil {
		if len(xy_if_one_is_set_y) == 1 {
			oldx, _ := p.Loc()
			p.SetLoc(oldx, xy_if_one_is_set_y[0])
		} else if len(xy_if_one_is_set_y) == 2 {
			p.SetLoc(xy_if_one_is_set_y[0], xy_if_one_is_set_y[1])
		}
	}
	// x, y := p.Loc()
	p.cursorPos = Point{X: 0, Y: 0}
	p.SetDefaultEventHandler(p.defaultKeyHandle)
	p.SetDrawFunc(p.defaultdraw)
	return p
}

func (pi *PanelInput) CursorMoveLeft() *PanelInput {
	pi.cursorPos.X -= 1
	if pi.cursorPos.X < 0 {
		pi.cursorPos.X = 0
	}
	return pi
}

func (pi *PanelInput) CursorMoveRight() *PanelInput {
	pi.cursorPos.X += 1
	if pi.cursorPos.X > pi.typedStr.Len() {
		pi.cursorPos.X = pi.typedStr.Len()
	}
	return pi
}

func (pi *PanelInput) SetText(text gs.Str) *PanelInput {
	pi.typedStr = text
	for i := 0; i < text.Len(); i++ {
		pi.CursorMoveRight()
	}
	return pi
}

func (pi *PanelInput) defaultKeyHandle(ev termbox.Event) bool {
	switch ev.Key {

	case K_DEL:
		if len(pi.typedStr) > 0 {
			pi.typedStr = pi.typedStr[:pi.typedStr.Len()-1]

			pi.CursorMoveLeft()

		}

	case termbox.KeyArrowLeft:

		pi.CursorMoveLeft()

	case termbox.KeyArrowRight:
		pi.CursorMoveRight()

	case termbox.KeyCtrlA:
		// typedStr += typedStr.ANSI(gs.ANSI_COLUMN_LEFT, 2)
		// panelLoc.Label(gs.S("col: ")+gs.S(panelLoc.X)+gs.S("offset :")+gs.S(offset), -1)
		// panelLoc.X -= (offset - 1)
		pi.cursorPos.X = 0
	case termbox.KeyCtrlE:

		pi.cursorPos.X = pi.typedStr.Len() - 1

	case K_CTRL_C:
		return true
	case termbox.KeyTab:
		pi.typedStr = pi.typedStr[:pi.cursorPos.X] + gs.Str("\t") + pi.typedStr[pi.cursorPos.X:]
		pi.CursorMoveRight()

	case termbox.KeySpace:
		pi.typedStr = pi.typedStr[:pi.cursorPos.X] + gs.Str(" ") + pi.typedStr[pi.cursorPos.X:]
		pi.CursorMoveRight()
	case termbox.KeyEnter:
		return true
	default:
		if pi.typedStr.Len() == 0 {
			pi.typedStr = gs.Str(ev.Ch)
		} else {
			pi.typedStr = pi.typedStr[:pi.cursorPos.X] + gs.Str(ev.Ch) + pi.typedStr[pi.cursorPos.X:]
		}

		pi.CursorMoveRight()

		// panelLoc.Label(gs.S(ev), -1)
	}
	return false

}

func (pi *PanelInput) defaultdraw() {
	col, row := pi.ContentLoc()
	col += pi.cursorPos.X
	row += pi.cursorPos.Y
	typed := pi.typedStr.Add(gs.Str("").ANSICursor(row, col))
	// pi.SetTitle(gs.S(pi.loc.HideCursor))
	pi.Write(typed)
	// fmt.Println(typed)
}

func QuickInput(x, y int, pre ...gs.Str) gs.Str {
	p := NewPanelInput(x, y)
	if pre != nil {
		p.SetText(pre[0])

	}
	p.Focus()
	if pre != nil && pre[0].Len() > 0 {
		return p.typedStr.Split(pre[0].Str(), 2)[1]
	}
	return p.typedStr
}

func TypedInput(pre ...gs.Str) gs.Str {
	y, x := gs.GetWindowsSize()
	x = x / 3
	y = y / 2
	p := NewPanelInput(x, y)
	p.SetSizeHeight(3)
	p.SetSizeWidth(100)

	p.SetBorder(true)
	if pre != nil {
		p.SetText(pre[0])
	}
	p.Focus()
	if pre != nil {
		return p.typedStr.Split(pre[0].Str(), 2)[1]
	}
	return p.typedStr
}
